# DomainEntityNativeQueryExecutor.java

    package org.codefilarete.stalactite.spring.repository.query.nativ;

    import java.util.ArrayList;
    import java.util.List;
    import java.util.Set;
    import java.util.function.Supplier;

    import org.codefilarete.stalactite.engine.runtime.RelationalEntityFinder;
    import org.codefilarete.stalactite.spring.repository.query.execution.AbstractQueryExecutor;
    import org.codefilarete.stalactite.spring.repository.query.execution.StalactiteQueryMethodInvocationParameters;
    import org.codefilarete.stalactite.spring.repository.query.StalactiteQueryMethod;
    import org.codefilarete.stalactite.sql.Dialect;

    /**
     * Classes for cases where the SQL given by @{@link org.codefilarete.stalactite.spring.repository.query.NativeQuery} annotation is expected to give
     * a result that is made of domain entities.
     *
     * @param <C> entity type
     * @author Guillaume Mary
     */
    public class DomainEntityNativeQueryExecutor<C> extends AbstractQueryExecutor<List<C>, C> {

    	private final String sql;
    	private final RelationalEntityFinder<C, ?, ?> relationalEntityFinder;
    	private final Dialect dialect;

    	public DomainEntityNativeQueryExecutor(StalactiteQueryMethod method,
    										   String sql,
    										   RelationalEntityFinder<C, ?, ?> relationalEntityFinder,
    										   Dialect dialect) {
    		super(method);
    		this.dialect = dialect;
    		this.sql = sql;
    		this.relationalEntityFinder = relationalEntityFinder;
    	}

    	@Override
    	public Supplier<List<C>> buildQueryExecutor(StalactiteQueryMethodInvocationParameters invocationParameters) {
    		return () -> {
    			Set<C> cs = relationalEntityFinder.selectFromQueryBean(sql, invocationParameters.getNamedValues(), invocationParameters.bindParameters(dialect));
    			return new ArrayList<>(cs);
    		};
    	}
    }